🎖️GitЯра🎖️
Node / meshtastic / Meshtastic-Android / files / feature / messaging / src / commonMain / kotlin / org / meshtastic / feature / messaging / ui / contact / Contacts.kt
Displaying Raw • Download
feature/messaging/src/commonMain/kotlin/org/meshtastic/feature/messaging/ui/contact/Contacts.kt fix/fdroid-map-rendering (113121c4) Text, 24.49 KB
T8b949e/*
* Copyright (c) 2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tf0883e@fileTb4b4b4:Te6edf3OptInTb4b4b4(Te6edf3ExperimentalMaterial3ExpressiveApiTff7b72::Te6edf3classTb4b4b4)
Tff7b72package T7ee787org.meshtastic.feature.messaging.ui.contact
Tff7b72import T7ee787androidx.compose.foundation.background
Tff7b72import T7ee787androidx.compose.foundation.clickable
Tff7b72import T7ee787androidx.compose.foundation.layout.Column
Tff7b72import T7ee787androidx.compose.foundation.layout.Row
Tff7b72import T7ee787androidx.compose.foundation.layout.fillMaxSize
Tff7b72import T7ee787androidx.compose.foundation.layout.fillMaxWidth
Tff7b72import T7ee787androidx.compose.foundation.layout.padding
Tff7b72import T7ee787androidx.compose.foundation.lazy.LazyColumn
Tff7b72import T7ee787androidx.compose.foundation.lazy.LazyListScope
Tff7b72import T7ee787androidx.compose.foundation.lazy.LazyListState
Tff7b72import T7ee787androidx.compose.foundation.lazy.rememberLazyListState
Tff7b72import T7ee787androidx.compose.foundation.selection.selectable
Tff7b72import T7ee787androidx.compose.material3.ExperimentalMaterial3Api
Tff7b72import T7ee787androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
Tff7b72import T7ee787androidx.compose.material3.Icon
Tff7b72import T7ee787androidx.compose.material3.IconButton
Tff7b72import T7ee787androidx.compose.material3.MaterialTheme
Tff7b72import T7ee787androidx.compose.material3.RadioButton
Tff7b72import T7ee787androidx.compose.material3.Scaffold
Tff7b72import T7ee787androidx.compose.material3.Text
Tff7b72import T7ee787androidx.compose.material3.TopAppBar
Tff7b72import T7ee787androidx.compose.runtime.Composable
Tff7b72import T7ee787androidx.compose.runtime.LaunchedEffect
Tff7b72import T7ee787androidx.compose.runtime.derivedStateOf
Tff7b72import T7ee787androidx.compose.runtime.getValue
Tff7b72import T7ee787androidx.compose.runtime.mutableIntStateOf
Tff7b72import T7ee787androidx.compose.runtime.mutableStateListOf
Tff7b72import T7ee787androidx.compose.runtime.mutableStateOf
Tff7b72import T7ee787androidx.compose.runtime.remember
Tff7b72import T7ee787androidx.compose.runtime.rememberCoroutineScope
Tff7b72import T7ee787androidx.compose.runtime.saveable.rememberSaveable
Tff7b72import T7ee787androidx.compose.runtime.setValue
Tff7b72import T7ee787androidx.compose.ui.Alignment
Tff7b72import T7ee787androidx.compose.ui.Modifier
Tff7b72import T7ee787androidx.compose.ui.hapticfeedback.HapticFeedback
Tff7b72import T7ee787androidx.compose.ui.hapticfeedback.HapticFeedbackType
Tff7b72import T7ee787androidx.compose.ui.platform.LocalHapticFeedback
Tff7b72import T7ee787androidx.compose.ui.semantics.Role
Tff7b72import T7ee787androidx.compose.ui.semantics.heading
Tff7b72import T7ee787androidx.compose.ui.semantics.semantics
Tff7b72import T7ee787androidx.compose.ui.semantics.stateDescription
Tff7b72import T7ee787androidx.compose.ui.unit.dp
Tff7b72import T7ee787androidx.lifecycle.compose.collectAsStateWithLifecycle
Tff7b72import T7ee787kotlinx.coroutines.flow.Flow
Tff7b72import T7ee787kotlinx.coroutines.flow.collectLatest
Tff7b72import T7ee787kotlinx.coroutines.launch
Tff7b72import T7ee787org.jetbrains.compose.resources.pluralStringResource
Tff7b72import T7ee787org.jetbrains.compose.resources.stringResource
Tff7b72import T7ee787org.meshtastic.core.common.util.CommonUri
Tff7b72import T7ee787org.meshtastic.core.common.util.NumberFormatter
Tff7b72import T7ee787org.meshtastic.core.common.util.nowMillis
Tff7b72import T7ee787org.meshtastic.core.model.ConnectionState
Tff7b72import T7ee787org.meshtastic.core.model.Contact
Tff7b72import T7ee787org.meshtastic.core.model.ContactKey
Tff7b72import T7ee787org.meshtastic.core.model.ContactSettings
Tff7b72import T7ee787org.meshtastic.core.model.util.TimeConstants
Tff7b72import T7ee787org.meshtastic.core.model.util.formatMuteRemainingTime
Tff7b72import T7ee787org.meshtastic.core.resources.Res
Tff7b72import T7ee787org.meshtastic.core.resources.are_you_sure
Tff7b72import T7ee787org.meshtastic.core.resources.cancel
Tff7b72import T7ee787org.meshtastic.core.resources.channel_invalid
Tff7b72import T7ee787org.meshtastic.core.resources.channels
Tff7b72import T7ee787org.meshtastic.core.resources.close_selection
Tff7b72import T7ee787org.meshtastic.core.resources.collapsed
Tff7b72import T7ee787org.meshtastic.core.resources.conversations
Tff7b72import T7ee787org.meshtastic.core.resources.currently
Tff7b72import T7ee787org.meshtastic.core.resources.delete
Tff7b72import T7ee787org.meshtastic.core.resources.delete_messages
Tff7b72import T7ee787org.meshtastic.core.resources.delete_selection
Tff7b72import T7ee787org.meshtastic.core.resources.direct_messages
Tff7b72import T7ee787org.meshtastic.core.resources.expanded
Tff7b72import T7ee787org.meshtastic.core.resources.mark_as_read
Tff7b72import T7ee787org.meshtastic.core.resources.mute_1_week
Tff7b72import T7ee787org.meshtastic.core.resources.mute_8_hours
Tff7b72import T7ee787org.meshtastic.core.resources.mute_always
Tff7b72import T7ee787org.meshtastic.core.resources.mute_notifications
Tff7b72import T7ee787org.meshtastic.core.resources.mute_selected
Tff7b72import T7ee787org.meshtastic.core.resources.mute_status_always
Tff7b72import T7ee787org.meshtastic.core.resources.mute_status_muted_for_days
Tff7b72import T7ee787org.meshtastic.core.resources.mute_status_muted_for_hours
Tff7b72import T7ee787org.meshtastic.core.resources.mute_status_unmuted
Tff7b72import T7ee787org.meshtastic.core.resources.okay
Tff7b72import T7ee787org.meshtastic.core.resources.select_all
Tff7b72import T7ee787org.meshtastic.core.resources.unmute
Tff7b72import T7ee787org.meshtastic.core.resources.unmute_selected
Tff7b72import T7ee787org.meshtastic.core.ui.component.MainAppBar
Tff7b72import T7ee787org.meshtastic.core.ui.component.MeshtasticDialog
Tff7b72import T7ee787org.meshtastic.core.ui.component.MeshtasticImportFAB
Tff7b72import T7ee787org.meshtastic.core.ui.component.MeshtasticTextDialog
Tff7b72import T7ee787org.meshtastic.core.ui.component.ScrollToTopEvent
Tff7b72import T7ee787org.meshtastic.core.ui.component.smartScrollToTop
Tff7b72import T7ee787org.meshtastic.core.ui.icon.Close
Tff7b72import T7ee787org.meshtastic.core.ui.icon.Delete
Tff7b72import T7ee787org.meshtastic.core.ui.icon.ExpandLess
Tff7b72import T7ee787org.meshtastic.core.ui.icon.ExpandMore
Tff7b72import T7ee787org.meshtastic.core.ui.icon.MarkChatRead
Tff7b72import T7ee787org.meshtastic.core.ui.icon.MeshtasticIcons
Tff7b72import T7ee787org.meshtastic.core.ui.icon.SelectAll
Tff7b72import T7ee787org.meshtastic.core.ui.icon.VolumeMute
Tff7b72import T7ee787org.meshtastic.core.ui.icon.VolumeUp
Tff7b72import T7ee787org.meshtastic.core.ui.util.parseDeepLinkOrInvalid
Tff7b72import T7ee787org.meshtastic.core.ui.util.rememberShowToastResource
Tff7b72import T7ee787org.meshtastic.proto.ChannelSet
Tff7b72import T7ee787kotlin.time.Duration.Companion.days
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffLongMethodTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffCyclomaticComplexMethodTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffLongParameterListTa5d6ff"Tb4b4b4)
Tf0883e@Composable
Tff7b72fun Td2a8ffContactsScreenTb4b4b4(
Te6edf3onNavigateToShareTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3onHandleDeepLinkTb4b4b4: Tb4b4b4(Te6edf3CommonUriTb4b4b4, Te6edf3onInvalidTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3viewModelTb4b4b4: Te6edf3ContactsViewModelTb4b4b4,
Te6edf3onClickNodeChipTb4b4b4: Tb4b4b4(Tffa657IntTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3onNavigateToMessagesTb4b4b4: Tb4b4b4(Tffa657StringTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3onNavigateToNodeDetailsTb4b4b4: Tb4b4b4(Tffa657IntTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3scrollToTopEventsTb4b4b4: Te6edf3FlowTff7b72<Te6edf3ScrollToTopEventTff7b72>Tff7b72?Tb4b4b4,
Te6edf3activeContactKeyTb4b4b4: Tffa657String?Tb4b4b4,
Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3showToast Tff7b72= Te6edf3rememberShowToastResourceTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3scope Tff7b72= Te6edf3rememberCoroutineScopeTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3connectionState Tff7b72by Te6edf3viewModelTb4b4b4.Te6edf3connectionStateTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3ourNode Tff7b72by Te6edf3viewModelTb4b4b4.Te6edf3ourNodeInfoTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)
Tff7b72var Te6edf3showMuteDialog Tff7b72by Te6edf3rememberSaveable Tb4b4b4{ Te6edf3mutableStateOfTb4b4b4(Tff7b72falseTb4b4b4) Tb4b4b4}
Tff7b72var Te6edf3showDeleteDialog Tff7b72by Te6edf3rememberSaveable Tb4b4b4{ Te6edf3mutableStateOfTb4b4b4(Tff7b72falseTb4b4b4) Tb4b4b4}
T8b949e// State for managing selected contacts
Tff7b72val Te6edf3selectedContactKeys Tff7b72= Te6edf3remember Tb4b4b4{ Te6edf3mutableStateListOfTff7b72<Tffa657StringTff7b72>Tb4b4b4(Tb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3isSelectionModeActive Tff7b72by Te6edf3remember Tb4b4b4{ Te6edf3derivedStateOf Tb4b4b4{ Te6edf3selectedContactKeysTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4) Tb4b4b4} Tb4b4b4}
T8b949e// State for contacts list. Channel placeholders (empty broadcast channels) are already merged in by the VM.
Tff7b72val Te6edf3contacts Tff7b72by Te6edf3viewModelTb4b4b4.Te6edf3contactListTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3channels Tff7b72by Te6edf3viewModelTb4b4b4.Te6edf3channelsTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3contactsListState Tff7b72= Te6edf3rememberLazyListStateTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3coroutineScope Tff7b72= Te6edf3rememberCoroutineScopeTb4b4b4(Tb4b4b4)
Te6edf3LaunchedEffectTb4b4b4(Te6edf3scrollToTopEventsTb4b4b4) Tb4b4b4{
Te6edf3scrollToTopEventsTff7b72?.Te6edf3collectLatest Tb4b4b4{ Te6edf3event Tff7b72-Tff7b72>
Tff7b72if Tb4b4b4(Te6edf3event Tff7b72=Tff7b72= Te6edf3ScrollToTopEventTb4b4b4.Te6edf3ConversationsTabPressedTb4b4b4) Tb4b4b4{
Te6edf3contactsListStateTb4b4b4.Te6edf3smartScrollToTopTb4b4b4(Te6edf3coroutineScopeTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
T8b949e// Derived state for selected contacts and count
Tff7b72val Te6edf3selectedContacts Tff7b72=
Te6edf3rememberTb4b4b4(Te6edf3contactsTb4b4b4, Te6edf3selectedContactKeysTb4b4b4) Tb4b4b4{ Te6edf3contactsTb4b4b4.Te6edf3filter Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3contactKey Tff7b72in Te6edf3selectedContactKeys Tb4b4b4} Tb4b4b4}
T8b949e// Get message count directly from repository for selected contacts
Tff7b72var Te6edf3selectedCount Tff7b72by Te6edf3remember Tb4b4b4{ Te6edf3mutableIntStateOfTb4b4b4(T79c0ff0Tb4b4b4) Tb4b4b4}
Te6edf3LaunchedEffectTb4b4b4(Te6edf3selectedContactKeysTb4b4b4.Te6edf3sizeTb4b4b4, Te6edf3selectedContactKeysTb4b4b4.Te6edf3joinToStringTb4b4b4(Ta5d6ff"Ta5d6ff,Ta5d6ff"Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3selectedCount Tff7b72= Te6edf3viewModelTb4b4b4.Te6edf3getTotalMessageCountTb4b4b4(Te6edf3selectedContactKeysTb4b4b4.Te6edf3toListTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4}
Tff7b72val Te6edf3isAllMuted Tff7b72= Te6edf3rememberTb4b4b4(Te6edf3selectedContactsTb4b4b4) Tb4b4b4{ Te6edf3selectedContactsTb4b4b4.Te6edf3all Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3isMuted Tb4b4b4} Tb4b4b4}
T8b949e// Callback functions for item interaction
Tff7b72val Te6edf3onContactClickTb4b4b4: Tb4b4b4(Te6edf3ContactTb4b4b4) Tff7b72-Tff7b72> Tffa657Unit Tff7b72= Tb4b4b4{ Te6edf3contact Tff7b72-Tff7b72>
Tff7b72if Tb4b4b4(Te6edf3isSelectionModeActiveTb4b4b4) Tb4b4b4{
T8b949e// If in selection mode, toggle selection
Tff7b72if Tb4b4b4(Te6edf3selectedContactKeysTb4b4b4.Te6edf3containsTb4b4b4(Te6edf3contactTb4b4b4.Te6edf3contactKeyTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3selectedContactKeysTb4b4b4.Te6edf3removeTb4b4b4(Te6edf3contactTb4b4b4.Te6edf3contactKeyTb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3selectedContactKeysTb4b4b4.Te6edf3addTb4b4b4(Te6edf3contactTb4b4b4.Te6edf3contactKeyTb4b4b4)
Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{
T8b949e// If not in selection mode, navigate to messages
Te6edf3onNavigateToMessagesTb4b4b4(Te6edf3contactTb4b4b4.Te6edf3contactKeyTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tff7b72val Te6edf3onNodeChipClickTb4b4b4: Tb4b4b4(Te6edf3ContactTb4b4b4) Tff7b72-Tff7b72> Tffa657Unit Tff7b72= Tb4b4b4{ Te6edf3contact Tff7b72-Tff7b72>
Tff7b72if Tb4b4b4(Te6edf3contactTb4b4b4.Te6edf3contactKeyTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ff!Ta5d6ff"Tb4b4b4)Tb4b4b4) Tb4b4b4{
T8b949e// if it's a node, look up the nodeNum including the !
Tff7b72val Te6edf3nodeKey Tff7b72= Te6edf3ContactKeyTb4b4b4(Te6edf3contactTb4b4b4.Te6edf3contactKeyTb4b4b4)Tb4b4b4.Te6edf3addressString
Tff7b72val Te6edf3node Tff7b72= Te6edf3viewModelTb4b4b4.Te6edf3getNodeTb4b4b4(Te6edf3nodeKeyTb4b4b4)
Te6edf3onNavigateToNodeDetailsTb4b4b4(Te6edf3nodeTb4b4b4.Te6edf3numTb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
T8b949e// Channels
Tb4b4b4}
Tb4b4b4}
Tff7b72val Te6edf3onContactLongClickTb4b4b4: Tb4b4b4(Te6edf3ContactTb4b4b4) Tff7b72-Tff7b72> Tffa657Unit Tff7b72= Tb4b4b4{ Te6edf3contact Tff7b72-Tff7b72>
T8b949e// Enter selection mode and select the item on long press
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3isSelectionModeActiveTb4b4b4) Tb4b4b4{
Te6edf3selectedContactKeysTb4b4b4.Te6edf3addTb4b4b4(Te6edf3contactTb4b4b4.Te6edf3contactKeyTb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
T8b949e// If already in selection mode, toggle selection
Tff7b72if Tb4b4b4(Te6edf3selectedContactKeysTb4b4b4.Te6edf3containsTb4b4b4(Te6edf3contactTb4b4b4.Te6edf3contactKeyTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3selectedContactKeysTb4b4b4.Te6edf3removeTb4b4b4(Te6edf3contactTb4b4b4.Te6edf3contactKeyTb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3selectedContactKeysTb4b4b4.Te6edf3addTb4b4b4(Te6edf3contactTb4b4b4.Te6edf3contactKeyTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Te6edf3ScaffoldTb4b4b4(
Te6edf3topBar Tff7b72= Tb4b4b4{
Te6edf3MainAppBarTb4b4b4(
Te6edf3title Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3conversationsTb4b4b4)Tb4b4b4,
Te6edf3ourNode Tff7b72= Te6edf3ourNodeTb4b4b4,
Te6edf3showNodeChip Tff7b72= Te6edf3ourNode Tff7b72!Tff7b72= Tff7b72null Tff7b72&Tff7b72& Te6edf3connectionState Tff7b72is Te6edf3ConnectionStateTb4b4b4.Te6edf3ConnectedTb4b4b4,
Te6edf3canNavigateUp Tff7b72= Tff7b72falseTb4b4b4,
Te6edf3onNavigateUp Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4,
Te6edf3actions Tff7b72= Tb4b4b4{
Tff7b72val Te6edf3unreadCountTotal Tff7b72by Te6edf3viewModelTb4b4b4.Te6edf3unreadCountTotalTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(T79c0ff0Tb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3unreadCountTotal Tff7b72> T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3IconButtonTb4b4b4(Te6edf3onClick Tff7b72= Tb4b4b4{ Te6edf3viewModelTb4b4b4.Te6edf3markAllAsReadTb4b4b4(Tb4b4b4) Tb4b4b4}Tb4b4b4) Tb4b4b4{
Te6edf3IconTb4b4b4(
Te6edf3MeshtasticIconsTb4b4b4.Te6edf3MarkChatReadTb4b4b4,
Te6edf3contentDescription Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3mark_as_readTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Te6edf3onClickChip Tff7b72= Tb4b4b4{ Te6edf3onClickNodeChipTb4b4b4(Tffa657itTb4b4b4.Te6edf3numTb4b4b4) Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Te6edf3floatingActionButton Tff7b72= Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3connectionState Tff7b72is Te6edf3ConnectionStateTb4b4b4.Te6edf3ConnectedTb4b4b4) Tb4b4b4{
Te6edf3MeshtasticImportFABTb4b4b4(
Te6edf3onImport Tff7b72= Tb4b4b4{ Te6edf3uriString Tff7b72-Tff7b72>
Tff7b72val Te6edf3onInvalidTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657Unit Tff7b72= Tb4b4b4{ Te6edf3scopeTb4b4b4.Te6edf3launch Tb4b4b4{ Te6edf3showToastTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3channel_invalidTb4b4b4) Tb4b4b4} Tb4b4b4}
Te6edf3parseDeepLinkOrInvalidTb4b4b4(Te6edf3uriStringTb4b4b4, Te6edf3onHandleDeepLinkTb4b4b4, Te6edf3onInvalidTb4b4b4)
Tb4b4b4}Tb4b4b4,
Te6edf3onShareChannels Tff7b72= Te6edf3onNavigateToShareTb4b4b4,
Te6edf3isContactContext Tff7b72= Tff7b72falseTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Tb4b4b4) Tb4b4b4{ Te6edf3paddingValues Tff7b72-Tff7b72>
Te6edf3ColumnTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3paddingValuesTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3isSelectionModeActiveTb4b4b4) Tb4b4b4{
T8b949e// Display selection toolbar when in selection mode
Te6edf3SelectionToolbarTb4b4b4(
Te6edf3selectedCount Tff7b72= Te6edf3selectedContactKeysTb4b4b4.Te6edf3sizeTb4b4b4,
Te6edf3onCloseSelection Tff7b72= Tb4b4b4{ Te6edf3selectedContactKeysTb4b4b4.Te6edf3clearTb4b4b4(Tb4b4b4) Tb4b4b4}Tb4b4b4,
Te6edf3onMuteSelected Tff7b72= Tb4b4b4{ Te6edf3showMuteDialog Tff7b72= Tff7b72true Tb4b4b4}Tb4b4b4,
Te6edf3onDeleteSelected Tff7b72= Tb4b4b4{ Te6edf3showDeleteDialog Tff7b72= Tff7b72true Tb4b4b4}Tb4b4b4,
Te6edf3onSelectAll Tff7b72= Tb4b4b4{
Te6edf3selectedContactKeysTb4b4b4.Te6edf3clearTb4b4b4(Tb4b4b4)
Te6edf3selectedContactKeysTb4b4b4.Te6edf3addAllTb4b4b4(Te6edf3contactsTb4b4b4.Te6edf3map Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3contactKey Tb4b4b4}Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Te6edf3isAllMuted Tff7b72= Te6edf3isAllMutedTb4b4b4, T8b949e// Pass the derived state
Tb4b4b4)
Tb4b4b4}
Tff7b72val Te6edf3collapsedSections Tff7b72by Te6edf3viewModelTb4b4b4.Te6edf3collapsedSectionsTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)
Te6edf3ContactListViewTb4b4b4(
Te6edf3contacts Tff7b72= Te6edf3contactsTb4b4b4,
Te6edf3selectedList Tff7b72= Te6edf3selectedContactKeysTb4b4b4,
Te6edf3activeContactKey Tff7b72= Te6edf3activeContactKeyTb4b4b4,
Te6edf3onClick Tff7b72= Te6edf3onContactClickTb4b4b4,
Te6edf3onLongClick Tff7b72= Te6edf3onContactLongClickTb4b4b4,
Te6edf3onNodeChipClick Tff7b72= Te6edf3onNodeChipClickTb4b4b4,
Te6edf3listState Tff7b72= Te6edf3contactsListStateTb4b4b4,
Te6edf3channels Tff7b72= Te6edf3channelsTb4b4b4,
Te6edf3collapsedSections Tff7b72= Te6edf3collapsedSectionsTb4b4b4,
Te6edf3onToggleSectionCollapse Tff7b72= Te6edf3viewModelTff7b72::Te6edf3toggleSectionCollapseTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3showDeleteDialogTb4b4b4) Tb4b4b4{
Te6edf3DeleteConfirmationDialogTb4b4b4(
Te6edf3selectedCount Tff7b72= Te6edf3selectedCountTb4b4b4,
Te6edf3onDismiss Tff7b72= Tb4b4b4{ Te6edf3showDeleteDialog Tff7b72= Tff7b72false Tb4b4b4}Tb4b4b4,
Te6edf3onConfirm Tff7b72= Tb4b4b4{
Te6edf3showDeleteDialog Tff7b72= Tff7b72false
Te6edf3viewModelTb4b4b4.Te6edf3deleteContactsTb4b4b4(Te6edf3selectedContactKeysTb4b4b4.Te6edf3toListTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3selectedContactKeysTb4b4b4.Te6edf3clearTb4b4b4(Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
T8b949e// Get contact settings for the dialog
Tff7b72val Te6edf3contactSettings Tff7b72by Te6edf3viewModelTb4b4b4.Te6edf3getContactSettingsTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Te6edf3initialValue Tff7b72= Te6edf3emptyMapTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3showMuteDialogTb4b4b4) Tb4b4b4{
Te6edf3MuteNotificationsDialogTb4b4b4(
Te6edf3selectedContactKeys Tff7b72= Te6edf3selectedContactKeysTb4b4b4.Te6edf3toListTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3contactSettings Tff7b72= Te6edf3contactSettingsTb4b4b4,
Te6edf3onDismiss Tff7b72= Tb4b4b4{ Te6edf3showMuteDialog Tff7b72= Tff7b72false Tb4b4b4}Tb4b4b4,
Te6edf3onConfirm Tff7b72= Tb4b4b4{ Te6edf3muteUntil Tff7b72-Tff7b72>
Te6edf3showMuteDialog Tff7b72= Tff7b72false
Te6edf3viewModelTb4b4b4.Te6edf3setMuteUntilTb4b4b4(Te6edf3selectedContactKeysTb4b4b4.Te6edf3toListTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3muteUntilTb4b4b4)
Te6edf3selectedContactKeysTb4b4b4.Te6edf3clearTb4b4b4(Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffLongMethodTa5d6ff"Tb4b4b4)
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffMuteNotificationsDialogTb4b4b4(
Te6edf3selectedContactKeysTb4b4b4: Te6edf3ListTff7b72<Tffa657StringTff7b72>Tb4b4b4,
Te6edf3contactSettingsTb4b4b4: Te6edf3MapTff7b72<Tffa657StringTb4b4b4, Te6edf3ContactSettingsTff7b72>Tb4b4b4,
Te6edf3onDismissTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3onConfirmTb4b4b4: Tb4b4b4(Tffa657LongTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4, T8b949e// Lambda to handle the confirmed mute duration
Tb4b4b4) Tb4b4b4{
T8b949e// Options for mute duration
Tff7b72val Te6edf3muteOptions Tff7b72= Te6edf3remember Tb4b4b4{
Te6edf3listOfTb4b4b4(
Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3unmute Te6edf3to T79c0ff0LTb4b4b4,
Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3mute_8_hours Te6edf3to Te6edf3TimeConstantsTb4b4b4.Te6edf3EIGHT_HOURSTb4b4b4.Te6edf3inWholeMillisecondsTb4b4b4,
Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3mute_1_week Te6edf3to T79c0ff7.Te6edf3daysTb4b4b4.Te6edf3inWholeMillisecondsTb4b4b4,
Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3mute_always Te6edf3to Tffa657LongTb4b4b4.Te6edf3MAX_VALUETb4b4b4,
Tb4b4b4)
Tb4b4b4}
T8b949e// State to hold the selected mute duration index
Tff7b72var Te6edf3selectedOptionIndex Tff7b72by Te6edf3remember Tb4b4b4{ Te6edf3mutableIntStateOfTb4b4b4(T79c0ff2Tb4b4b4) Tb4b4b4} T8b949e// Default to "Always"
Te6edf3MeshtasticDialogTb4b4b4(
Te6edf3onDismiss Tff7b72= Te6edf3onDismissTb4b4b4, T8b949e// Dismiss the dialog when clicked outside
Te6edf3titleRes Tff7b72= Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3mute_notificationsTb4b4b4,
Te6edf3confirmTextRes Tff7b72= Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3okayTb4b4b4,
Te6edf3onConfirm Tff7b72= Tb4b4b4{
Tff7b72val Te6edf3selectedMuteDuration Tff7b72= Te6edf3muteOptionsTff7b72[Te6edf3selectedOptionIndexTff7b72]Tb4b4b4.Te6edf3second
Te6edf3onConfirmTb4b4b4(Te6edf3selectedMuteDurationTb4b4b4)
Te6edf3onDismissTb4b4b4(Tb4b4b4) T8b949e// Dismiss the dialog after confirming
Tb4b4b4}Tb4b4b4,
Te6edf3dismissTextRes Tff7b72= Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3cancelTb4b4b4,
Te6edf3text Tff7b72= Tb4b4b4{
Te6edf3Column Tb4b4b4{
T8b949e// Show current mute status
Te6edf3selectedContactKeysTb4b4b4.Te6edf3forEach Tb4b4b4{ Te6edf3contactKey Tff7b72-Tff7b72>
Te6edf3contactSettingsTff7b72[Te6edf3contactKeyTff7b72]Tff7b72?.Te6edf3let Tb4b4b4{ Te6edf3settings Tff7b72-Tff7b72>
Tff7b72val Te6edf3now Tff7b72= Te6edf3nowMillis
Tff7b72val Te6edf3statusText Tff7b72=
Tff7b72when Tb4b4b4{
Te6edf3settingsTb4b4b4.Te6edf3muteUntil Tff7b72> T79c0ff0 Tff7b72&Tff7b72& Te6edf3settingsTb4b4b4.Te6edf3muteUntil Tff7b72!Tff7b72= Tffa657LongTb4b4b4.Te6edf3MAX_VALUE Tff7b72-Tff7b72> Tb4b4b4{
Tff7b72val Te6edf3remaining Tff7b72= Te6edf3settingsTb4b4b4.Te6edf3muteUntil Tff7b72- Te6edf3now
Tff7b72if Tb4b4b4(Te6edf3remaining Tff7b72> T79c0ff0Tb4b4b4) Tb4b4b4{
Tff7b72val Tb4b4b4(Te6edf3daysTb4b4b4, Te6edf3hoursTb4b4b4) Tff7b72= Te6edf3formatMuteRemainingTimeTb4b4b4(Te6edf3remainingTb4b4b4)
Tff7b72val Te6edf3hoursFormatted Tff7b72= Te6edf3NumberFormatterTb4b4b4.Te6edf3formatTb4b4b4(Te6edf3hoursTb4b4b4, T79c0ff1Tb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3days Tff7b72>Tff7b72= T79c0ff1Tb4b4b4) Tb4b4b4{
Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3mute_status_muted_for_daysTb4b4b4, Te6edf3daysTb4b4b4, Te6edf3hoursFormattedTb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3mute_status_muted_for_hoursTb4b4b4, Te6edf3hoursFormattedTb4b4b4)
Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3mute_status_unmutedTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Te6edf3settingsTb4b4b4.Te6edf3muteUntil Tff7b72=Tff7b72= Tffa657LongTb4b4b4.Te6edf3MAX_VALUE Tff7b72-Tff7b72> Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3mute_status_alwaysTb4b4b4)
Tff7b72else Tff7b72-Tff7b72> Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3mute_status_unmutedTb4b4b4)
Tb4b4b4}
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3currentlyTb4b4b4) Tff7b72+ Ta5d6ff"Ta5d6ff Ta5d6ff" Tff7b72+ Te6edf3statusTextTb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3bottom Tff7b72= T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Te6edf3muteOptionsTb4b4b4.Te6edf3forEachIndexed Tb4b4b4{ Te6edf3indexTb4b4b4, Tb4b4b4(Te6edf3stringResTb4b4b4, Te6edf3_Tb4b4b4) Tff7b72-Tff7b72>
Tff7b72val Te6edf3isSelected Tff7b72= Te6edf3index Tff7b72=Tff7b72= Te6edf3selectedOptionIndex
Tff7b72val Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3stringResTb4b4b4)
Te6edf3RowTb4b4b4(
Te6edf3modifier Tff7b72=
Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3selectableTb4b4b4(Te6edf3selected Tff7b72= Te6edf3isSelectedTb4b4b4, Te6edf3onClick Tff7b72= Tb4b4b4{ Te6edf3selectedOptionIndex Tff7b72= Te6edf3index Tb4b4b4}Tb4b4b4)
Tb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3vertical Tff7b72= T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4,
Te6edf3verticalAlignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3CenterVerticallyTb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3RadioButtonTb4b4b4(Te6edf3selected Tff7b72= Te6edf3isSelectedTb4b4b4, Te6edf3onClick Tff7b72= Tb4b4b4{ Te6edf3selectedOptionIndex Tff7b72= Te6edf3index Tb4b4b4}Tb4b4b4)
Te6edf3TextTb4b4b4(Te6edf3text Tff7b72= Te6edf3textTb4b4b4, Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3start Tff7b72= T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffDeleteConfirmationDialogTb4b4b4(
Te6edf3selectedCountTb4b4b4: Tffa657IntTb4b4b4, T8b949e// Number of items to be deleted
Te6edf3onDismissTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3onConfirmTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4, T8b949e// Lambda to handle the delete action
Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3deleteMessage Tff7b72=
Te6edf3pluralStringResourceTb4b4b4(
Te6edf3ResTb4b4b4.Te6edf3pluralsTb4b4b4.Te6edf3delete_messagesTb4b4b4,
Te6edf3selectedCountTb4b4b4,
Te6edf3selectedCountTb4b4b4, T8b949e// Pass the count as a format argument
Tb4b4b4)
Te6edf3MeshtasticTextDialogTb4b4b4(
Te6edf3titleRes Tff7b72= Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3are_you_sureTb4b4b4,
Te6edf3message Tff7b72= Te6edf3deleteMessageTb4b4b4,
Te6edf3confirmTextRes Tff7b72= Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3deleteTb4b4b4,
Te6edf3onConfirm Tff7b72= Tb4b4b4{
Te6edf3onConfirmTb4b4b4(Tb4b4b4)
Te6edf3onDismissTb4b4b4(Tb4b4b4) T8b949e// Dismiss the dialog after confirming
Tb4b4b4}Tb4b4b4,
Te6edf3onDismiss Tff7b72= Te6edf3onDismissTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tf0883e@OptInTb4b4b4(Te6edf3ExperimentalMaterial3ApiTff7b72::Te6edf3classTb4b4b4)
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffSelectionToolbarTb4b4b4(
Te6edf3selectedCountTb4b4b4: Tffa657IntTb4b4b4,
Te6edf3onCloseSelectionTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3onMuteSelectedTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3onDeleteSelectedTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3onSelectAllTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3isAllMutedTb4b4b4: Tffa657BooleanTb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3TopAppBarTb4b4b4(
Te6edf3title Tff7b72= Tb4b4b4{ Te6edf3TextTb4b4b4(Te6edf3text Tff7b72= Ta5d6ff"Tffd700$Te6edf3selectedCountTa5d6ff"Tb4b4b4) Tb4b4b4}Tb4b4b4,
Te6edf3navigationIcon Tff7b72= Tb4b4b4{
Te6edf3IconButtonTb4b4b4(Te6edf3onClick Tff7b72= Te6edf3onCloseSelectionTb4b4b4) Tb4b4b4{
Te6edf3IconTb4b4b4(Te6edf3MeshtasticIconsTb4b4b4.Te6edf3CloseTb4b4b4, Te6edf3contentDescription Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3close_selectionTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Te6edf3actions Tff7b72= Tb4b4b4{
Te6edf3IconButtonTb4b4b4(Te6edf3onClick Tff7b72= Te6edf3onMuteSelectedTb4b4b4) Tb4b4b4{
Te6edf3IconTb4b4b4(
Te6edf3imageVector Tff7b72=
Tff7b72if Tb4b4b4(Te6edf3isAllMutedTb4b4b4) Tb4b4b4{
Te6edf3MeshtasticIconsTb4b4b4.Te6edf3VolumeUp
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3MeshtasticIconsTb4b4b4.Te6edf3VolumeMute
Tb4b4b4}Tb4b4b4,
Te6edf3contentDescription Tff7b72=
Te6edf3stringResourceTb4b4b4(
Tff7b72if Tb4b4b4(Te6edf3isAllMutedTb4b4b4) Tb4b4b4{
Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3unmute_selected
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3mute_selected
Tb4b4b4}Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Te6edf3IconButtonTb4b4b4(Te6edf3onClick Tff7b72= Te6edf3onDeleteSelectedTb4b4b4) Tb4b4b4{
Te6edf3IconTb4b4b4(Te6edf3MeshtasticIconsTb4b4b4.Te6edf3DeleteTb4b4b4, Te6edf3contentDescription Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3delete_selectionTb4b4b4)Tb4b4b4)
Tb4b4b4}
Te6edf3IconButtonTb4b4b4(Te6edf3onClick Tff7b72= Te6edf3onSelectAllTb4b4b4) Tb4b4b4{
Te6edf3IconTb4b4b4(Te6edf3MeshtasticIconsTb4b4b4.Te6edf3SelectAllTb4b4b4, Te6edf3contentDescription Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3select_allTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffContactListViewTb4b4b4(
Te6edf3contactsTb4b4b4: Te6edf3ListTff7b72<Te6edf3ContactTff7b72>Tb4b4b4,
Te6edf3selectedListTb4b4b4: Te6edf3ListTff7b72<Tffa657StringTff7b72>Tb4b4b4,
Te6edf3activeContactKeyTb4b4b4: Tffa657String?Tb4b4b4,
Te6edf3onClickTb4b4b4: Tb4b4b4(Te6edf3ContactTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3onLongClickTb4b4b4: Tb4b4b4(Te6edf3ContactTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3onNodeChipClickTb4b4b4: Tb4b4b4(Te6edf3ContactTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3listStateTb4b4b4: Te6edf3LazyListStateTb4b4b4,
Te6edf3collapsedSectionsTb4b4b4: Te6edf3SetTff7b72<Tffa657StringTff7b72>Tb4b4b4,
Te6edf3onToggleSectionCollapseTb4b4b4: Tb4b4b4(Tffa657StringTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3modifierTb4b4b4: Te6edf3Modifier Tff7b72= Te6edf3ModifierTb4b4b4,
Te6edf3channelsTb4b4b4: Te6edf3ChannelSet? Tff7b72= Tff7b72nullTb4b4b4,
Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3haptic Tff7b72= Te6edf3LocalHapticFeedbackTb4b4b4.Te6edf3current
Tff7b72val Tb4b4b4(Te6edf3channelContactsTb4b4b4, Te6edf3dmContactsTb4b4b4) Tff7b72=
Te6edf3rememberTb4b4b4(Te6edf3contactsTb4b4b4) Tb4b4b4{
Tff7b72val Tb4b4b4(Te6edf3channelPartTb4b4b4, Te6edf3dmPartTb4b4b4) Tff7b72= Te6edf3contactsTb4b4b4.Te6edf3partition Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3sectionTb4b4b4(Tb4b4b4) Tff7b72=Tff7b72= Te6edf3ContactSectionTb4b4b4.Te6edf3CHANNELS Tb4b4b4}
T8b949e// Channels keep a fixed slot order (channel index); DMs stay in the query's recency order.
Te6edf3channelPartTb4b4b4.Te6edf3sortedBy Tb4b4b4{ Te6edf3ContactKeyTb4b4b4(Tffa657itTb4b4b4.Te6edf3contactKeyTb4b4b4)Tb4b4b4.Te6edf3channel Tb4b4b4} Te6edf3to Te6edf3dmPart
Tb4b4b4}
Tff7b72val Te6edf3channelsTitle Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3channelsTb4b4b4)
Tff7b72val Te6edf3dmTitle Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3direct_messagesTb4b4b4)
Te6edf3LazyColumnTb4b4b4(Te6edf3state Tff7b72= Te6edf3listStateTb4b4b4, Te6edf3modifier Tff7b72= Te6edf3modifierTb4b4b4.Te6edf3fillMaxSizeTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3contactSectionTb4b4b4(
Te6edf3section Tff7b72= Te6edf3ContactSectionTb4b4b4.Te6edf3CHANNELSTb4b4b4,
Te6edf3title Tff7b72= Te6edf3channelsTitleTb4b4b4,
Te6edf3sectionContacts Tff7b72= Te6edf3channelContactsTb4b4b4,
Te6edf3collapsed Tff7b72= Te6edf3ContactSectionTb4b4b4.Te6edf3CHANNELSTb4b4b4.Te6edf3key Tff7b72in Te6edf3collapsedSectionsTb4b4b4,
Te6edf3onToggleCollapse Tff7b72= Te6edf3onToggleSectionCollapseTb4b4b4,
Te6edf3selectedList Tff7b72= Te6edf3selectedListTb4b4b4,
Te6edf3activeContactKey Tff7b72= Te6edf3activeContactKeyTb4b4b4,
Te6edf3onClick Tff7b72= Te6edf3onClickTb4b4b4,
Te6edf3onLongClick Tff7b72= Te6edf3onLongClickTb4b4b4,
Te6edf3onNodeChipClick Tff7b72= Te6edf3onNodeChipClickTb4b4b4,
Te6edf3channels Tff7b72= Te6edf3channelsTb4b4b4,
Te6edf3haptic Tff7b72= Te6edf3hapticTb4b4b4,
Tb4b4b4)
Te6edf3contactSectionTb4b4b4(
Te6edf3section Tff7b72= Te6edf3ContactSectionTb4b4b4.Te6edf3DIRECT_MESSAGESTb4b4b4,
Te6edf3title Tff7b72= Te6edf3dmTitleTb4b4b4,
Te6edf3sectionContacts Tff7b72= Te6edf3dmContactsTb4b4b4,
Te6edf3collapsed Tff7b72= Te6edf3ContactSectionTb4b4b4.Te6edf3DIRECT_MESSAGESTb4b4b4.Te6edf3key Tff7b72in Te6edf3collapsedSectionsTb4b4b4,
Te6edf3onToggleCollapse Tff7b72= Te6edf3onToggleSectionCollapseTb4b4b4,
Te6edf3selectedList Tff7b72= Te6edf3selectedListTb4b4b4,
Te6edf3activeContactKey Tff7b72= Te6edf3activeContactKeyTb4b4b4,
Te6edf3onClick Tff7b72= Te6edf3onClickTb4b4b4,
Te6edf3onLongClick Tff7b72= Te6edf3onLongClickTb4b4b4,
Te6edf3onNodeChipClick Tff7b72= Te6edf3onNodeChipClickTb4b4b4,
Te6edf3channels Tff7b72= Te6edf3channelsTb4b4b4,
Te6edf3haptic Tff7b72= Te6edf3hapticTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tff7b72private Tff7b72fun Te6edf3LazyListScopeTb4b4b4.Td2a8ffcontactSectionTb4b4b4(
Te6edf3sectionTb4b4b4: Te6edf3ContactSectionTb4b4b4,
Te6edf3titleTb4b4b4: Tffa657StringTb4b4b4,
Te6edf3sectionContactsTb4b4b4: Te6edf3ListTff7b72<Te6edf3ContactTff7b72>Tb4b4b4,
Te6edf3collapsedTb4b4b4: Tffa657BooleanTb4b4b4,
Te6edf3onToggleCollapseTb4b4b4: Tb4b4b4(Tffa657StringTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3selectedListTb4b4b4: Te6edf3ListTff7b72<Tffa657StringTff7b72>Tb4b4b4,
Te6edf3activeContactKeyTb4b4b4: Tffa657String?Tb4b4b4,
Te6edf3onClickTb4b4b4: Tb4b4b4(Te6edf3ContactTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3onLongClickTb4b4b4: Tb4b4b4(Te6edf3ContactTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3onNodeChipClickTb4b4b4: Tb4b4b4(Te6edf3ContactTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3channelsTb4b4b4: Te6edf3ChannelSet?Tb4b4b4,
Te6edf3hapticTb4b4b4: Te6edf3HapticFeedbackTb4b4b4,
Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3sectionContactsTb4b4b4.Te6edf3isEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tff7b72return
Te6edf3stickyHeaderTb4b4b4(Te6edf3key Tff7b72= Ta5d6ff"Tffd700${Te6edf3sectionTb4b4b4.Te6edf3keyTffd700}Ta5d6ff_headerTa5d6ff"Tb4b4b4) Tb4b4b4{
Te6edf3ContactSectionHeaderTb4b4b4(
Te6edf3title Tff7b72= Te6edf3titleTb4b4b4,
Te6edf3count Tff7b72= Te6edf3sectionContactsTb4b4b4.Te6edf3sizeTb4b4b4,
Te6edf3collapsed Tff7b72= Te6edf3collapsedTb4b4b4,
Te6edf3onClick Tff7b72= Tb4b4b4{ Te6edf3onToggleCollapseTb4b4b4(Te6edf3sectionTb4b4b4.Te6edf3keyTb4b4b4) Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3collapsedTb4b4b4) Tb4b4b4{
Te6edf3itemsTb4b4b4(Te6edf3count Tff7b72= Te6edf3sectionContactsTb4b4b4.Te6edf3sizeTb4b4b4, Te6edf3key Tff7b72= Tb4b4b4{ Te6edf3index Tff7b72-Tff7b72> Te6edf3sectionContactsTff7b72[Te6edf3indexTff7b72]Tb4b4b4.Te6edf3contactKey Tb4b4b4}Tb4b4b4) Tb4b4b4{ Te6edf3index Tff7b72-Tff7b72>
Tff7b72val Te6edf3contact Tff7b72= Te6edf3sectionContactsTff7b72[Te6edf3indexTff7b72]
Te6edf3ContactItemTb4b4b4(
Te6edf3contact Tff7b72= Te6edf3contactTb4b4b4,
Te6edf3selected Tff7b72= Te6edf3selectedListTb4b4b4.Te6edf3containsTb4b4b4(Te6edf3contactTb4b4b4.Te6edf3contactKeyTb4b4b4)Tb4b4b4,
Te6edf3isActive Tff7b72= Te6edf3contactTb4b4b4.Te6edf3contactKey Tff7b72=Tff7b72= Te6edf3activeContactKeyTb4b4b4,
Te6edf3onClick Tff7b72= Tb4b4b4{ Te6edf3onClickTb4b4b4(Te6edf3contactTb4b4b4) Tb4b4b4}Tb4b4b4,
Te6edf3onLongClick Tff7b72= Tb4b4b4{
Te6edf3hapticTb4b4b4.Te6edf3performHapticFeedbackTb4b4b4(Te6edf3HapticFeedbackTypeTb4b4b4.Te6edf3LongPressTb4b4b4)
Te6edf3onLongClickTb4b4b4(Te6edf3contactTb4b4b4)
Tb4b4b4}Tb4b4b4,
Te6edf3onNodeChipClick Tff7b72= Tb4b4b4{ Te6edf3onNodeChipClickTb4b4b4(Te6edf3contactTb4b4b4) Tb4b4b4}Tb4b4b4,
Te6edf3channels Tff7b72= Te6edf3channelsTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffContactSectionHeaderTb4b4b4(Te6edf3titleTb4b4b4: Tffa657StringTb4b4b4, Te6edf3countTb4b4b4: Tffa657IntTb4b4b4, Te6edf3collapsedTb4b4b4: Tffa657BooleanTb4b4b4, Te6edf3onClickTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3expandStateDescription Tff7b72= Te6edf3stringResourceTb4b4b4(Tff7b72if Tb4b4b4(Te6edf3collapsedTb4b4b4) Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3collapsed Tff7b72else Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3expandedTb4b4b4)
Te6edf3RowTb4b4b4(
Te6edf3modifier Tff7b72=
Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3backgroundTb4b4b4(Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3surfaceTb4b4b4)
Tb4b4b4.Te6edf3clickableTb4b4b4(Te6edf3role Tff7b72= Te6edf3RoleTb4b4b4.Te6edf3ButtonTb4b4b4, Te6edf3onClick Tff7b72= Te6edf3onClickTb4b4b4)
Tb4b4b4.Te6edf3semantics Tb4b4b4{ Te6edf3stateDescription Tff7b72= Te6edf3expandStateDescription Tb4b4b4}
Tb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3horizontal Tff7b72= T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4, Te6edf3vertical Tff7b72= T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4,
Te6edf3verticalAlignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3CenterVerticallyTb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Ta5d6ff"Tffd700$Te6edf3titleTa5d6ff (Tffd700$Te6edf3countTa5d6ff)Ta5d6ff"Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3titleSmallTb4b4b4,
Te6edf3color Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3primaryTb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3weightTb4b4b4(T79c0ff1fTb4b4b4)Tb4b4b4.Te6edf3semantics Tb4b4b4{ Te6edf3headingTb4b4b4(Tb4b4b4) Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Te6edf3IconTb4b4b4(
Te6edf3imageVector Tff7b72= Tff7b72if Tb4b4b4(Te6edf3collapsedTb4b4b4) Te6edf3MeshtasticIconsTb4b4b4.Te6edf3ExpandMore Tff7b72else Te6edf3MeshtasticIconsTb4b4b4.Te6edf3ExpandLessTb4b4b4,
Te6edf3contentDescription Tff7b72= Tff7b72nullTb4b4b4,
Te6edf3tint Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3primaryTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Served by rngit 1.5.0 - Generated in 0.27s